package cn.edu.cug.cs.gtl.docsrv.img.updater;
 
import cn.edu.cug.cs.gtl.docsrv.img.block.ImageBlock;
import cn.edu.cug.cs.gtl.mybatis.Session;
import cn.edu.cug.cs.gtl.mybatis.mapper.img.*;

import java.math.BigDecimal;

public interface BlockUpdater {
    /**
     * 将一个ImageBlock插入数据库
     * @param block 图像块
     * @return 成功返回true,否则返回false
     */
    boolean insert(ImageBlock block);

    /**
     * 读取本地目录中的所有图像文档，将其插入图像库中
     * @param localDir 本地目录
     * @return 成功返回true,否则返回false
     */
    boolean insert(String localDir);

    /**
     * 根据imgInternalId删除文档记录
     * @param block 必须填充imgInternalId
     * @return 成功返回true,否则返回false
     */
    boolean delete(ImageBlock block);

    /**
     * 根据imgInternalId删除文档记录
     * @param imgInternalId
     * @return 成功返回true,否则返回false
     */
    boolean delete(BigDecimal imgInternalId);

    /**
     * 根据imgInternalId更新数据库中的记录
     * @param block 该对象的imgInternalId必须填充
     * @return 更新成功返回true,否则返回false
     */
    boolean update(ImageBlock block);


    /**
     * 将一个图像文档插入数据库
     * SHPITEM为SHP_ITEM表中的一条记录
     * SHPFILE为SHP_FILE表中的一条记录
     * 通过SHP_INTERNAL_ID连接
     * @param imgItem 图像元数据信息
     * @param imgFile 图像文件内容
     * @return
     */
    static boolean insert(Session session, ImgItem imgItem, ImgFile imgFile){
        ImgItemMapper imgItemMapper = session.getMapper(ImgItemMapper.class);
        if(imgItem.getImgInternalId() == null){
            imgItem.setImgInternalId(imgItemMapper.nextInternalId());
        }
        imgItemMapper.insert(imgItem);
        ImgFileMapper imgFileMapper = session.getMapper(ImgFileMapper.class);
        imgFileMapper.insert(imgFile);
        session.commit();
        return true;
    }

    /**
     * 将imgAll插入图像库,
     * SHPALL为SHP_ALL数据表中的一条记录
     * 具体文件内容以BLOB方式存放
     * @param imgAll 图像文档
     * @return 成功返回true,否则返回false
     */
    static boolean insert(Session session, ImgAll imgAll){
        ImgAllMapper imgAllMapper = session.getMapper(ImgAllMapper.class);
        if(imgAll.getImgInternalId()==null) {
            imgAll.setImgInternalId(imgAllMapper.nextInternalId());
        }
        imgAllMapper.insert(imgAll);
        session.commit();
        return true;
    }

    /**
     * 根据imgInternalId删除SHP_ALL数据表中的图像文档记录
     * @param imgAll 必须填充imgInternalId
     * @return
     */
    static boolean delete(Session session,ImgAll imgAll){
        BigDecimal imgInternalId = imgAll.getImgInternalId();
        ImgAllMapper imgAllMapper = session.getMapper(ImgAllMapper.class);
        imgAllMapper.deleteByPrimaryKey(imgInternalId);
        session.commit();
        return true;
    }

    /**
     * 根据imgInternalId删除SHP_ITEM表中的一条记录和SHP_FILE表中的一条记录
     * @param imgItem 必须填充imgInternalId
     * @return
     */
    static boolean delete(Session session,ImgItem imgItem){
        BigDecimal imgInternalId = imgItem.getImgInternalId();
        ImgItemMapper imgItemMapper = session.getMapper(ImgItemMapper.class);
        imgItemMapper.deleteByPrimaryKey(imgInternalId);
        ImgFileMapper imgFileMapper = session.getMapper(ImgFileMapper.class);
        imgFileMapper.deleteByPrimaryKey(imgInternalId);
        session.commit();
        return true;
    }

    /**
     * 根据imgInternalId更新数据库中SHP_ITEM和SHP_FILE数据表的记录
     * @param imgItem 该对象的imgInternalId必须填充
     * @param imgFile 更新文档文件的内容
     * @return 更新成功返回true,否则返回false
     */
    static boolean update(Session session,ImgItem imgItem, ImgFile imgFile){
        ImgItemMapper imgItemMapper = session.getMapper(ImgItemMapper.class);
        imgItemMapper.updateByPrimaryKey(imgItem);
        ImgFileMapper docFileMapper = session.getMapper(ImgFileMapper.class);
        docFileMapper.updateByPrimaryKey(imgFile);
        session.commit();
        return true;
    }

    /**
     * 根据imgInternalId更新数据库中SHP_ALL数据表的记录
     * @param imgAll 该对象的imgInternalId必须填充
     * @return 更新成功返回true,否则返回false
     */
    static boolean update(Session session,ImgAll imgAll){
        ImgAllMapper imgAllMapper = session.getMapper(ImgAllMapper.class);
        imgAllMapper.updateByPrimaryKey(imgAll);
        session.commit();
        return true;
    }
}
